from sqlalchemy import Column, String, Integer, orm

from app.models.base import Base

class Book(Base):
    id = Column(Integer, primary_key=True, autoincrement=True)
    title = Column(String(50), nullable=False)
    author = Column(String(30), default='未名')
    binding = Column(String(20))
    publisher = Column(String(50))
    price = Column(String(20))
    pages = Column(Integer)
    pubdate = Column(String(20))
    isbn = Column(String(15), nullable=False, unique=True)
    summary = Column(String(1000))
    image = Column(String(50))


    # 当执行 dict(模型) 这个方法的时候，后面会进入到keys这个方法，获取模型的键名  ； 【最后变成 return self.fields  统一放到base.py中了】
    # def keys(self):
    #     # return  ['id', 'title', 'author', 'binding',
    #     #            'publisher',
    #     #            'price','pages', 'pubdate', 'isbn',
    #     #            'summary',
    #     #            'image']
    #
    #     return self.fields  # 配合 __init__结合@orm.reconstructor的调整后， 可以写成return self.fields

    # 为什么将fields 放到self.fields，而不是放到类下面，
    # 如果放到类下面作为需要的字段返回，然后通过Base.py的hide方法删除某个字段，会导致再次请求的时候被删除的字段就丢失了 就会报错，所以放到了实例上
    #
    #  为什么要使用 @orm.reconstructor装饰器
    # 是因为sqlalchemy 实例化对象不是采用普通方法执行的，他是通过元类实例化对象的， 所以通过sqlalchemy 实例化也不会进入到下面的__init__方法中
    # 但是如果加上了@orm.reconstructor装饰器，sqlalchemy 实例化对象就会进入到下面的__init__方法中
    @orm.reconstructor
    def __init__(self):
        super().__init__()
        self.fields = ['id', 'title', 'author', 'binding',
                       'publisher',
                       'price','pages', 'pubdate', 'isbn',
                       'summary',
                       'image']

